package city.spring.modules.checkinfee.service;

import city.spring.modules.checkinfee.entity.CheckinfeeEntity;
import city.spring.modules.checkinfee.vo.CheckinfeeVO;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import org.apache.ibatis.annotations.Param;

import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.security.Principal;
import java.util.Date;
import java.util.List;

/**
 * Service：入院收费
 *
 * @author 谢金婷
 * @date 2020-08-27 10:19:04
 */
public interface CheckinfeeService extends IService<CheckinfeeEntity> {
    String CACHE_NAME = "checkinfee";

    /**
     * 业务处理：保存一个 <strong>入院收费</strong>
     *
     * @param entity 入院收费
     */
    void saveCheckinfee(CheckinfeeEntity entity);

    /**
     * 业务处理：修改一个 <strong>入院收费</strong>
     *
     * @param entity 入院收费
     */
    void updateCheckinfee(CheckinfeeEntity entity);

    /**
     * 业务处理：删除一个 <strong>入院收费</strong>
     *
     * @param primaryKey 主键ID
     */
    void deleteCheckinfee(String primaryKey);

    /**
     * 业务处理：删除多个 <strong>入院收费</strong>
     *
     * @param primaryKeys 主键ID列表
     */
    void deleteCheckinfee(List<String> primaryKeys);

    IPage<CheckinfeeVO> listPage(Page<? extends CheckinfeeEntity> page, @Param(Constants.WRAPPER) Wrapper<? extends CheckinfeeEntity> wrapper);

    CheckinfeeEntity getCheckfeeByolamanId(String oldmanId);

    IPage<CheckinfeeVO> monthlyFeelist(Page<? extends CheckinfeeEntity> page, @Param(Constants.WRAPPER) Wrapper<? extends CheckinfeeEntity> wrapper);

    @Override
    default List<CheckinfeeEntity> list() {
        return null;
    }

    List<CheckinfeeVO> monthlyFeelist2(@Param(Constants.WRAPPER) Wrapper<? extends CheckinfeeEntity> wrapper2);

    CheckinfeeVO monthlyFeelist3(@Param(Constants.WRAPPER) Wrapper<? extends CheckinfeeEntity> wrapper2);

    /**
     * 根据老人id查找缴费类别为1：入院缴费的缴费记录
     *
     * @return
     */
    CheckinfeeEntity getCheckinfeeWithCategory(String oldmanId);

    CheckinfeeEntity getLatestPayRecord(String personId);

    /**
     * 添加一个月度收费
     *
     * @param entity
     * @param user
     * @return
     */
    CheckinfeeEntity saveMonthfee(CheckinfeeEntity entity, @NotNull Principal user);

    /**
     * 添加多个月度收费
     *
     * @param oldids
     */
    void addMonthPayRecords(List<String> oldids);

    /**
     * 获取月度缴费记录
     *
     * @param page
     * @param wrapper
     * @return
     */
    IPage<CheckinfeeVO> monthPayRecords(Page<? extends CheckinfeeEntity> page, @Param(Constants.WRAPPER) Wrapper<? extends CheckinfeeEntity> wrapper);

    /**
     * 获取月度缴费的打印信息
     *
     * @param feeid
     * @return
     */
    CheckinfeeVO monthPayPrintInfo(String feeid);

    /**
     * 退住结算：获取已交费用记录（入院缴费/月度缴费）
     *
     * @param personId
     * @param leaveDate
     * @return
     */
    List<CheckinfeeVO> settlementPayRecords(String personId, Date leaveDate);

    /**
     * 退住结算：获取 某个老人 是否需要补交费，补交到哪个月
     *
     * @param personId
     * @param leaveDate
     * @return
     */
    Object[] isAlreadyPayBeforeLeaveMonth(String personId, Date leaveDate);

    /**
     * 退住结算：获取结算结果
     *
     * @param paySum
     * @param billSum
     * @param balanceMount
     * @param depositMount
     * @param otherNeed
     * @param fiveTypeFee
     * @return
     */
    Object[] settlementResults(BigDecimal paySum, BigDecimal billSum, BigDecimal balanceMount, BigDecimal depositMount, BigDecimal otherNeed, BigDecimal fiveTypeFee);

    /**
     * 结算账单：已交账单 根据结算记录Id，对应的老人id，获取入住记录中老人最新的的入住日期、退住日期，再从缴费录checkinfee获取这两个日期间的记录，再由费用记录expense_record表获取金额信息
     *
     * @param oldmanId
     * @return
     */
    List<CheckinfeeVO> getpayRecords(String oldmanId);

}